第3章 変数を適切に使う
code:txt
3.1 ローカル変数
何もシジルが無い
API デザインケーススタディ
一番いいものを一番簡単に使えるようにする
3.1.1
まずサンプルコードがムズい
&foo で渡している
to_proc があるのが前提
メソッド呼び出しを削る、という話をしている
割と異常な部類
内容は分かりやすい
3.1.2
破壊的だとキャッシュできないから困るねって話
稀にやりがち
now もよくある
昔の Rails でよくあった
scope に now を渡す
最近は必ず Lambda で包まないといけなくなったのでミスが減った
3.1.3 スコープゲート
shadowing の話
define_method だと書き換わるのは地獄
定数じゃなくローカル変数にすることで「隠す」は良い
インスタンス変数や定数はアクセスしやすい
ローカル変数も binding を取得するとアクセス可能
3.1.4 命名
スコープの大きさに合わせた名前にしよう
スコープゲートに注意というのも良い
これって rubocop 何かあったりするんだろうか。事故怖い
roda の話は面白い
req は r としている
roda は JelemyEvans のプロダクト
3.2 インスタンス変数を活用する
即値オブジェクト
唯一のインスタンス
3.2.1
memoise
||= で不十分な場合、defined? を使う
あるある
freeze している場合
面白テクニック
インスタンス変数の方がローカル変数よりも危うい
どこかから変更される可能性がある
なので、インスタンス変数があると Ractor で共有できない
共有可能オブジェクトの条件
3.2.2
インスタンス変数のスコープ
self と一致する
map を定義して instance_eval する
バカじゃないの
3.2.3
ASCII 以外は避けよう
3.3 定数
定数も上書きできる
3.3.1 定数のスコープ
class A
W
X
Y # 定義した後に
Z
end
class Object
U
Y # A の親で上書きすると?
end
class B
X # 上書き
Z # 上書き
end
定数の探索
右へ一歩、それから上へ
メタプログラミングRuby
ネストの難しさ
class E
class ::C
...
クラスの中で継承関係に無いクラスを呼ぶなよと思うが。。
ここでは外のスコープの E::W が参照される
外のスコープの親クラスは参照されない
C::A::X は見えない
「クラスのインスタンス変数」
クラス自身もクラスクラスのインスタンス
変数はスコープはインスタンス変数と同じ
3.3.2
private_constant しても再代入できる
再代入しても可視性は変わらない
特異クラスにメソッドを定義する
class A
class << self
# ココは A インスタンス
end
end
3.3.3 定数の命名
class/module とも CamelCase
定数は UPPER_SNAKE_CASE
ALLCAPS なるほどねぇ
sequel の話題
sequel は JelemyEvans のプロダクト
JelemyEvans の異常さ
Issue/PR が 0
3.4 クラス変数を置き換える
子クラスで上書きしたら親クラスでも値が変わる罠
子クラスで新たなクラス変数を定義すると親クラスから参照できない
更に親クラスで上書きすると、子クラスで呼べていたのがエラーになるようになる
3.4.1
定数で良い?
書き換えると warning が出る
メソッドの中から定義できない
ので const_set する
定数の値をミュータブルにするのは天才
3.4.2
クラスインスタンス変数にする
worker ごとに値が違うのでは?
3.4.3
クラスインスタンス変数にする その2
inherited で継承時に値をコピーする
inherited の使い道
プラグインシステムを作るときによく使う
Cache::Foo < Cache::Base みたいな
3.5
ついにグローバル変数!
unshift
先頭に入れる
gem 作るときに定番コード
ensure
稀にこういう使いどころがある
stderr
$stdout はグローバル変数
初期値は定数 STDOUT
current_user
どうするのか
controller はリクエストごとにインスタンスが作られるので、普通にインスタンス変数で良い
リクエストローカルにするのもある
Thread.current#[] は Fiber ローカルって話がありましたね
count はどうするのが良いのか
うーん?
クラスのインスタンス変数を使いたいかどうかだと謎
3.6 まとめ
変数の使い分けを学びました